from django.conf import settings
from django.core.files.storage import Storage
from fdfs_client.client import Fdfs_client


class FastDFSStorage(Storage):
    """自定义文件存储系统"""
    def __init__(self, client_conf=None, base_url=None):
        """初始化文件存储对象的构造方法"""
        # if client_conf == None:
        #     self.client_conf = settings.FDFS_CLIENT_CONF
        # else:
        #     self.client_conf = client_conf
        #
        # if base_url == None:
        #     self.base_url = settings.FDFS_BASE_URL
        # else:
        #     self.base_url = client_conf
        # 如果client_conf参数为None,就读取or后面的值
        self.client_conf = client_conf or settings.FDFS_CLIENT_CONF
        self.base_url = base_url or settings.FDFS_BASE_URL

        pass

    def _open(self, name, mode='rb'):
        """
        储存类用于打开文件:因为必须实现，但是此处是文件存储不需要打开文件，所以重写没用到，所以pass
        :param name: 要打开的文件的名字
        :param mode: 打开的模式，read bytes
        :return: None
        """
        pass

    def _save(self, name, content):
        """
        实现文件存储:在这个方法里面将文件转存到FastDFS服务器
        :param name: 要存储的文件的名字
        :param content: 要存储的文件对象，File类型的对象，将来使用content.read()读取对象中的文件二进制
        :return: file_id
        """
        # 创建对接fdfs的客户端对象
        # client = Fdfs_client('meiduo_mall/utils/fastdfs/client.conf')
        # client = Fdfs_client(settings.FDFS_CLIENT_CONF)
        client = Fdfs_client(self.client_conf)

        # 将文件转存到fdfs
        # ret = client.upload_by_filename('/Users/caolingli/Desktop/1.jpeg')
        ret = client.upload_by_buffer(content.read())

        # 判断文件上传是否成功
        if ret.get('Status') != 'Upload successed.':
            raise Exception('upload file failed')

        file_id = ret.get('Remote file_id')
        # 在自定义了文件存储系统之后，我们只需要返回file_id即可
        # 将来文件存储系统会"自动的"将file_id存储到对应的ImageFiled字段中
        return file_id

    def exists(self, name):
        """
        判断文件是否存在，判断本地是否存储了该文件,如果存储了就不会再存储，如果没有存储就调用_save()
        :param name: 要判断的文件的名字
        :return: True(文件存在) / False(文件不存在)
        """
        return False

    def url(self, fileid):
        """
        返回文件的绝对路径的,下载图片时使用的
        :param fileid: 是要读取的文件的名字，fileid = file_id
        :return: 文件绝对路径 http://192.168.103.134:8888/group1/M00/00/00/wKhnhluTuniAezl6AAC4j90Tziw02.jpeg
        """
        # return 'http://192.168.103.134:8888/' + fileid
        return self.base_url + fileid

# {'Group name': 'group1',
# 'Remote file_id': 'group1/M00/00/00/rBCSg1uWN-qAKwZoAK82EUYCLD815.jpeg',
# 'Status': 'Upload successed.',
# 'Local file name': '/Users/caolingli/Desktop/1.jpeg',
# 'Uploaded size': '10.00MB',
# 'Storage IP': '172.16.146.131'}